[XEND] No need to decompress the initrd when building a domain.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 9 Oct 2006 12:50:00 +0000 (13:50 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 9 Oct 2006 12:50:00 +0000 (13:50 +0100)
The guest OS should be capable of parsing an image file in
whatever format was produced by that OS's tools. Furthermore,
we have seen initrd images with trailing garbage. This causes
us to calculate the wrong size for the uncompressed data and hence
fail to build the guest.
Signed-off-by: Keir Fraser <keir@xensource.com>
tools/libxc/xc_linux_build.c

index 98c84da3b20c75ae6c3ce19afc5bdab89522f5cb..594aed0aafcad1b2f29c9a2ccf7b65088e6c4e6c 100644 (file)
@@ -38,7 +38,7 @@ struct initrd_info {
     enum { INITRD_none, INITRD_file, INITRD_mem } type;
     unsigned long len;
     union {
-        gzFile file_handle;
+        int fd;
         char *mem_addr;
     } u;
 };
@@ -152,7 +152,7 @@ int load_initrd(int xc_handle, domid_t dom,
         }
         else
         {
-            if ( gzread(initrd->u.file_handle, page, PAGE_SIZE) == -1 )
+            if ( read(initrd->u.fd, page, PAGE_SIZE) == -1 )
             {
                 PERROR("Error reading initrd image, could not");
                 return -EINVAL;
@@ -1344,20 +1344,16 @@ int xc_linux_build(int xc_handle,
 
     if ( (initrd_name != NULL) && (strlen(initrd_name) != 0) )
     {
-        initrd_info.type = INITRD_file;
-
         if ( (fd = open(initrd_name, O_RDONLY)) < 0 )
         {
             PERROR("Could not open the initial ramdisk image");
             goto error_out;
         }
 
-        initrd_info.len = xc_get_filesz(fd);
-        if ( (initrd_info.u.file_handle = gzdopen(fd, "rb")) == NULL )
-        {
-            PERROR("Could not allocate decompression state for initrd");
-            goto error_out;
-        }
+        initrd_info.type = INITRD_file;
+        initrd_info.u.fd = fd;
+        initrd_info.len  = lseek(fd, 0, SEEK_END);
+        lseek(fd, 0, SEEK_SET);
     }
 
     sts = xc_linux_build_internal(xc_handle, domid, image, image_size,
@@ -1367,8 +1363,8 @@ int xc_linux_build(int xc_handle,
 
  error_out:
     free(image);
-    if ( initrd_info.type == INITRD_file && initrd_info.u.file_handle )
-        gzclose(initrd_info.u.file_handle);
+    if ( initrd_info.type == INITRD_file )
+        close(initrd_info.u.fd);
     else if ( fd >= 0 )
         close(fd);